using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using PQT_RELACIONAL;
using ENT_Entidades;
using Microsoft.ApplicationBlocks.Data;

namespace PQT_RELACIONAL
{

        public abstract class AD_ABM
        {
            #region propiedades
            private string _connectionString;
            public string connectionString
            {
                get
                {
                    _connectionString = @"Data Source=PC\SQLEXPRESS;Initial Catalog=NuevoConsultorioSQL;User ID=sa; Password=clinica123";
                        //ConfigurationManager.AppSettings["cadenaConexion"];
                    return _connectionString;
                }
                set { _connectionString = value; }
            }

            //public enum Caracteristica
            //{
            //////    Ninguna = 0,
            //////    MercadosOrigenExportaciones = 1,
            //////    MercadosDestinoExportaciones = 2,
            //////    MercadosOrigenImportaciones = 3,
            //////    MercadosDestinoImportaciones = 4
            //}

            protected enum TipoDato
            {
                GUID = 1,
                STRING = 2,
                INT = 3,
                DATETIME = 4,
                BOOL = 5,
                VARCHAR = 6
            }

            private SP_CLINICA _SP;

            internal SP_CLINICA SP
            {
                get
                {
                    if (_SP == null) { _SP = new SP_CLINICA(); }
                    return _SP;
                }
                set { _SP = value; }
            }

            #endregion propiedades


            #region metodos
            protected bool getError(dtsErrores errores)
            {
                bool valido = false;
                if (errores.Error[0].hayError > 0)
                {
                    valido = true;
                }
                return valido;
            }
            /// <summary>
            /// Devuelve un dataset a partir de uno tipado y una lista de parametros
            /// </summary>
            /// <param name="dts">Dataset tipado a llenar, que se utiliza para determinar el SP a utilizar</param>
            /// <param name="nomTabla">Nombre de la Tabla a llenar</param>
            /// <param name="param">Lista de parametros del SP</param>
            /// <returns></returns>
            protected DataSet AD_Leer(DataSet dts, string nomTabla, string storeProc)
            {
                string[] nombreTablas = new string[] { nomTabla };

                return AD_Leer(dts, nombreTablas, storeProc);
            }

            /// <summary>
            /// Devuelve un dataset a partir de uno tipado y una lista de parametros
            /// </summary>
            /// <param name="dts">Dataset tipado a llenar, que se utiliza para determinar el SP a utilizar</param>
            /// <param name="nomTabla">Nombre de la Tabla a llenar</param>
            /// <param name="param">Lista de parametros del SP</param>
            /// <returns></returns>
            protected DataSet AD_Leer(DataSet dts, string[] nomTablas, string storeProc)
            {
                SqlHelper.FillDataset(connectionString
                  , storeProc//SP.Leer(dts)
                  , dts
                  , nomTablas);
                return dts;
            }

            /// <summary>
            /// Devuelve un dataset a partir de uno tipado y una lista de parametros
            /// </summary>
            /// <param name="dts">Dataset tipado a llenar, que se utiliza para determinar el SP a utilizar</param>
            /// <param name="nomTabla">Nombre de la Tabla a llenar</param>
            /// <param name="param">Lista de parametros del SP</param>
            /// <returns></returns>
            protected DataSet AD_Leer(DataSet dts, string nomTabla, string storeProc, string[,] param)
            {
                string[] nombreTablas = new string[] { nomTabla };

                return AD_Leer(dts, nombreTablas, storeProc, param);
            }
            /// <summary>
            /// Devuelve un dataset a partir de uno tipado y una lista de parametros
            /// </summary>
            /// <param name="dts">Dataset tipado a llenar,</param>            
            /// <param name="nomTablas">Nombre de las Tablas a llenar</param>
            /// <param name="storeProc">Nombre del Procedimiento almacenado a utilizar</param>
            /// <param name="param">Lista de parametros del SP</param>
            /// <returns></returns>
            protected DataSet AD_Leer(DataSet dts, string[] nomTablas, string storeProc, string[,] param)
            {
                SqlHelper.FillDataset(connectionString
                  , storeProc//SP.Leer(dts)
                  , dts
                  , nomTablas
                  , GetListaSQLParameters(param));
                return dts;
            }
            //protected DataSet AD_Leer(DataSet dts, string nomDB)
            //{
            //    string[] nombreTablas = new string[] { nomDB };

            //    return AD_Leer(dts, nombreTablas);
            //}
            //protected DataSet AD_Leer(DataSet dts, string[] nomTablas)
            //{                
            //    SqlHelper.FillDataset(connectionString
            //      , GetNombreStrProcLeer(dts)
            //      , dts
            //      , nomTablas);
            //    return dts;
            //}
            //protected DataSet AD_Filtrar(DataSet dts, string nomDB, string[,] param)
            //{
            //    string[] nombreTabla = new string[] { nomDB };

            //    return AD_Filtrar(dts, nombreTabla, param);
            //}

            //protected DataSet AD_Filtrar(DataSet dts, string[] nombreTabla, string[,] param)
            //{
            //    SqlHelper.FillDataset(connectionString
            //      , GetNombreStrProcFiltrar(dts)
            //      , dts
            //      , nombreTabla
            //      , GetListaSQLParameters(param));//, GetListaSQLParameters(param)
            //    return dts;
            //}
            //protected DataSet AD_Filtrar(DataSet dts, string nomDB, string[,] param, Caracteristica caract)
            //{
            //    string[] nombreTabla = new string[] { nomDB };

            //    return AD_Filtrar(dts, nombreTabla, param, caract);
            //}
            //protected DataSet AD_Filtrar(DataSet dts, string[] nombreTabla, string[,] param, Caracteristica caract)
            //{
            //    //TODO: falta ver el case en que vengan parametros en param
            //    SqlHelper.FillDataset(connectionString
            //      , GetNombreStrProcFiltrar(dts, caract)
            //      , dts
            //      , nombreTabla);//, GetListaSQLParameters(param)
            //    return dts;
            //}



            //protected dtsErrores AD_Borrar(string id, Tablas tbl)
            //{
            //    DataSet dts = null;
            //    try
            //    {
            //        dts = SqlHelper.ExecuteDataset(
            //         connectionString, GetNombreStrProcBorrar(tbl)
            //         , new SqlParameter(GetNombreIdTabla(tbl), new Guid(id))
            //         );
            //    }
            //    catch (Exception err) { string msg = err.Message; }
            //    return MapearErrores(dts);
            //}

            //protected dtsErrores AD_Agregar(string[,] param, Tablas tbl)
            //{
            //    DataSet dts = null;
               
            //    dts = SqlHelper.ExecuteDataset(
            //        connectionString, GetNombreStrProcAgregar(tbl)
            //        , GetListaSQLParameters(param)
            //        );
              
               
            //    return MapearErrores(dts);
            //}

            //protected dtsErrores AD_Modificar(string[,] nomParam, Tablas tbl)
            //{
            //    DataSet dts = null;

            //    try
            //    {
            //        dts = SqlHelper.ExecuteDataset(
            //             connectionString, GetNombreStrProcModificar(tbl)
            //             , GetListaSQLParameters(nomParam)
            //             );
            //    }
            //    catch (Exception err) { string msg = err.Message; }
            //    return MapearErrores(dts);
            //}

            //protected DataSet AD_Existencia(string[,] nomParam, Tablas tbl)
            //{
            //    DataSet dts = null;

            //    try
            //    {
            //        dts = SqlHelper.ExecuteDataset(
            //             connectionString, GetNombreStrProcExistencia(tbl)
            //             , GetListaSQLParameters(nomParam)
            //             );
            //    }
            //    catch (Exception err)
            //    { string msg = err.Message; }
            //    return dts;
            //}

            protected static dtsErrores MapearErrores(DataSet dts)
            {
                dtsErrores Resultado = new dtsErrores();
                object[] valores;
                valores = dts.Tables[0].Rows[0].ItemArray;
                Resultado.Error.AddErrorRow(
                      Convert.ToInt16(valores[0])
                    , Convert.ToInt16(valores[1])
                    , Convert.ToString(valores[2])
                    );
                return Resultado;
            }


            //private SqlParameter[] GetListaSQLParameters(string[,] parametros)
            //{
            //    int cant = (parametros.Length / 3);
            //    SqlParameter[] lista = new SqlParameter[cant];
            //    for (int i = 0; i < cant; i++)
            //    {
            //        lista[i] = new SqlParameter(parametros[i, 0], GetParametro(parametros[i, 1], parametros[i, 2]));
            //    }
            //    return lista;
            //}

            //private object GetParametro(string valor, string tipo)
            //{
            //    object parametro = new object();
            //    if (tipo == TipoDato.STRING.ToString()) { parametro = valor; }
            //    else if (tipo == TipoDato.GUID.ToString()) { parametro =(valor==null )?null: new Guid(valor); }
            //    else if (tipo == TipoDato.INT.ToString()) { parametro = Convert.ToInt32(valor); }
            //    else if (tipo == TipoDato.DATETIME.ToString()) { parametro = Convert.ToDateTime(valor); }
            //    return parametro;
            //}


         //
            private SqlParameter[] GetListaSQLParameters(string[,] parametros)
            {
                int cant = (parametros.Length / 3);
                SqlParameter[] lista = new SqlParameter[cant];
                for (int i = 0; i < cant; i++)
                {
                    lista[i] = new SqlParameter(parametros[i, 0], GetTipoParametro(parametros[i, 2]));
                    lista[i].Value = GetValorParametro(parametros[i, 1], parametros[i, 2]);
                }
                return lista;
            }

            private SqlDbType GetTipoParametro(string tipo)
            {
                SqlDbType tipoParam = SqlDbType.Xml;
                if (tipo == TipoDato.STRING.ToString()) { tipoParam = SqlDbType.Char; }
                else if (tipo == TipoDato.GUID.ToString()) { tipoParam = SqlDbType.UniqueIdentifier; }
                else if (tipo == TipoDato.INT.ToString()) { tipoParam = SqlDbType.Int; }
                else if (tipo == TipoDato.DATETIME.ToString()) { tipoParam = SqlDbType.DateTime; }
                else if (tipo == TipoDato.BOOL.ToString()) { tipoParam = SqlDbType.Bit; }
                else if (tipo == TipoDato.VARCHAR.ToString()) { tipoParam = SqlDbType.VarChar; }
                return tipoParam;
            }

            private object GetValorParametro(string valor, string tipo)
            {
                object parametro = new object();
                if (tipo == TipoDato.STRING.ToString()) { parametro = valor; }
                else if (tipo == TipoDato.VARCHAR.ToString()) { parametro = valor; }
                else if (tipo == TipoDato.GUID.ToString())
                {
                    parametro = valor;
                    if (valor != null) parametro = new Guid(valor);
                }
                else if (tipo == TipoDato.INT.ToString()) { parametro = Convert.ToInt32(valor); }
                else if (tipo == TipoDato.DATETIME.ToString()) { parametro = Convert.ToDateTime(valor); }
                else if (tipo == TipoDato.BOOL.ToString()) { parametro = Convert.ToBoolean(valor); }
                return parametro;
            }
        




            #endregion

            #region Datos StoreProcedures
            //protected string GetNombreStrProcLeer(DataSet dts)
            //{
            //    return SP.Leer(dts);
            //}

            //protected string GetNombreStrProcFiltrar(DataSet dts)
            //{
            //    return SP.Filtrar(dts);
            //}
            //private string GetNombreStrProcFiltrar(DataSet dts, Caracteristica caract)
            //{
            //    return SP.Filtrar(dts, caract);
            //}

            //protected string GetNombreStrProcExistencia(Tablas tbl)
            //{
            //    return SP.Existencia(tbl);
            //}

            //protected string GetNombreStrProcBorrar(Tablas tbl)
            //{
            //    return SP.Borrar(tbl);
            //}

            //protected string GetNombreStrProcAgregar(Tablas tbl)
            //{
            //    return SP.Agregar(tbl);
            //}

            //protected string GetNombreStrProcModificar(Tablas tbl)
            //{
            //    return SP.Modificar(tbl);
            //}

            //protected string GetNombreIdTabla(Tablas tbl)
            //{
            //    return SP.getIdTabla(tbl);
            //}

            #endregion Datos StoreProcedures
        }
    }

